#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
#include <vector>
#include <iostream>

int main()
{
    extern char** environ;
    printf("I am a process begin!\n");

    execl("/usr/bin/pwd","pwd","--color=auto",NULL);

    exit(0);

    printf("I am a process end!\n");

    return 0;
}




//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 3;
//        while(cnt--)
//        {
//            printf("child do something...PID:%d,PPID:%d\n",getpid(),getppid());
//            sleep(2);
//        }
//        exit(3);
//    }
//
//    while(1)
//    {
//        int status = 0;
//        pid_t ret = waitpid(id, &status, WNOHANG);
//        if (ret > 0){
//            printf("wait child success...\n");
//            printf("exit code:%d\n", WEXITSTATUS(status));
//            break;                                                    
//        }
//        else if (ret == 0){
//            printf("father do other things...\n");
//            sleep(1);
//                                                    
//        }
//        else{
//            printf("waitpid error...\n");
//            break;                                 
//         }
//    }
//    return 0;
//}
//

//int main()
//{
//    pid_t ids[10];
//    for(int i = 0;i<10;i++)
//    {
//        pid_t id = fork();
//
//        if(id == 0)
//        {
//            printf("child process creat successful...PID:%d\n",getpid());
//            sleep(1);
//            exit(i);    
//        }
//        ids[i] = id;
//    }
//
//
//    	for (int i = 0; i < 10; i++)
//        {
//		int status = 0;
//		pid_t ret = waitpid(ids[i], &status, 0);
//		if (ret >= 0)
//        {
//			//wait child success
//			printf("wiat child success..PID:%d\n", ids[i]);
//			if (WIFEXITED(status))
//            {
//				//exit normal
//				printf("exit code:%d\n", WEXITSTATUS(status));
//			}
//			else
//            {
//				//signal killed
//				printf("killed by signal %d\n", status & 0x7F);
//			}
//		}
//	}
//	return 0;
//}
//



//int show()
//{
//    printf("hello world");
//    sleep(1);
//    _exit(1);
//}

//typedef void (*headler_t)();
//
//std::vector<headler_t> headlers;
//
//
//void fun_one()
//{
//    printf("这是一个临时任务1\n");
//}
//
//
//void fun_two()
//{
//    printf("这是一个临时任务2\n");
//}
//
//void Load()
//{
//    headlers.push_back(fun_one);
//    headlers.push_back(fun_two);
//}
//
//
//int main()
//{
//
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("I am child:[%d]\n",cnt);
//            sleep(1);
//        }
//
//        exit(9);
//    }
//    else
//    {
//        int quit = 0;
//        while(!quit)
//        {
//            int status = 0;
//            pid_t res = waitpid(id,&status,WNOHANG);//非阻塞方式等待
//        
//            if(res > 0)
//            {
//                printf("wait child success,exit code: %d\n", WEXITSTATUS(status));
//                quit = 1;
//            }
//            else if(res == 0)
//            {
//                printf("子进程还在运行中，暂时还没有退出，父进程可以在等一等, 处理一下其他事情？？\n");
//                if(headlers.empty())
//                {
//                    Load();
//                }
//
//                for(auto iter : headlers)
//                {
//                    iter();
//                }
//            }
//            else{
//                printf("wait失败!\n");
//                quit = 1;
//            }
//            sleep(1);
//        }
//    }
//
//    return 0;
//}
   // pid_t id = fork();
   // if(id == 0)
   // {
   //     int cnt = 9;
   //     while(cnt--)
   //     {
   //         printf("I am child,PID:[%d],PPID:[%d]\n",getpid(),getppid());
   //         sleep(1);
   //     }

   //     exit(0);
   // }
   // else{

   //     while(1)
   //     {
   //         printf("I am parent,PID:[%d],PPID:[%d]\n",getpid(),getppid());
   //         sleep(1);
   //      }
   // }

  // int status = 0;
  // pid_t ret = waitpid(id,&status,0);

  // if(ret >= 0)
  // {
  //     printf("wait child success ...\n");
  //     if(WIFEXITED(status))
  //     {
  //         printf("exit code: %d\n",WEXITSTATUS(status));
  //     }
  //     else{
  //         printf("kill by siganl: %d\n",status & 0x7f);
  //     }
  // }


  //  sleep(3);

  //  return 0;

    
    
  

   //show();
   //return 0;




   // for(int i = 0;i<150;i++)
   // {
   //     printf("%d:%s\n",i,strerror(i));
   // }
   // printf("我是一个进程:%d\n",getpid());

   // pid_t id = fork();

   // if(id == 0)
   // {
   //     printf("我是子进程，id是%d,return值：%d\n",getpid(),id);
   //     return 0;
   // }
   // else
   // {
   //     printf("我是父进程，id是%d,return值：%d\n",getpid(),id);
   //     return 0;
   // }
//}
